LshProjection
局部敏感哈希(Locality Sensitive Hashing, LSH)投影算子。该算子通过多个哈希组(Hash Groups)对输入特征进行处理,每组生成一个指定位宽(bits_per_hash)的哈希签名(int32)。
内部逻辑基于 FNV1a 哈希算法和加权评分机制,将高维特征映射为低维的离散哈希值。
- 计算过程:
对于每个哈希组 $i$,循环执行 $j$ 次($j < bits_per_hash$)。
每次根据特定的哈希种子 $seed_{i,j}$ 计算特征与权重的加权评分,并通过评分符号决定一个 Bit 位(0 或 1)。
将生成的 Bit 位拼接成一个完整的 32 位整型哈希签名。
- 输入:
hash_seed - 哈希种子数组地址(float 类型)。
feature - 输入特征向量地址(int32 类型)。
weight - 权重向量地址(类型随算子名而定,若为 NULL 则不加权)。
hash_group_num - 生成的哈希组数量(即输出结果的个数)。
bits_per_hash - 每组哈希签名的有效位数(通常 $le 32$)。
feature_num - 特征向量的维度。
core_mask(int, 可选) - 核掩码(仅适用于共享存储版本)。
- 输出:
output - 存储生成的哈希签名地址(int32 数组)。
- 支持平台:
FT78NEMT7004
备注
FT78NE 支持权重类型:int8 (i8), int16 (i16), int32 (i32), fp32 (fp), fp64 (dp)
MT7004 支持权重类型:int16 (i16), int32 (i32), fp16 (hp), fp32 (fp)
特征输入(feature)在所有平台上固定为 int32 类型。
输出结果(output)在所有平台上固定为 int32 类型。
共享存储版本:
-
void i8_lsh_projection_s(const float *hash_seed, const int32_t *feature, const int8_t *weight, int32_t *output, int hash_group_num, int bits_per_hash, int feature_num, int core_mask)
-
void i16_lsh_projection_s(const float *hash_seed, const int32_t *feature, const int16_t *weight, int32_t *output, int hash_group_num, int bits_per_hash, int feature_num, int core_mask)
-
void i32_lsh_projection_s(const float *hash_seed, const int32_t *feature, const int32_t *weight, int32_t *output, int hash_group_num, int bits_per_hash, int feature_num, int core_mask)
-
void hp_lsh_projection_s(const float *hash_seed, const int32_t *feature, const half *weight, int32_t *output, int hash_group_num, int bits_per_hash, int feature_num, int core_mask)
-
void fp_lsh_projection_s(const float *hash_seed, const int32_t *feature, const float *weight, int32_t *output, int hash_group_num, int bits_per_hash, int feature_num, int core_mask)
-
void dp_lsh_projection_s(const float *hash_seed, const int32_t *feature, const double *weight, int32_t *output, int hash_group_num, int bits_per_hash, int feature_num, int core_mask)
C调用示例:
1// FT78NE 示例:fp32 权重,多核共享存储 2#include "78NE/utils.h" 3 4int main() { 5 float* hash_seed = (float*)0xA0000000; 6 int32_t* feature = (int32_t*)0xA1000000; 7 float* weight = (float*)0xA2000000; 8 int32_t* output = (int32_t*)0xB0000000; 9 10 int hash_group_num = 128; 11 int bits_per_hash = 16; 12 int feature_num = 64; 13 int core_mask = 0xFF; 14 15 fp_lsh_projection_s(hash_seed, feature, weight, output, 16 hash_group_num, bits_per_hash, feature_num, core_mask); 17 return 0; 18}
私有存储版本:
-
void i8_lsh_projection_p(const float *hash_seed, const int32_t *feature, const int8_t *weight, int32_t *output, int hash_group_num, int bits_per_hash, int feature_num)
-
void i16_lsh_projection_p(const float *hash_seed, const int32_t *feature, const int16_t *weight, int32_t *output, int hash_group_num, int bits_per_hash, int feature_num)
-
void i32_lsh_projection_p(const float *hash_seed, const int32_t *feature, const int32_t *weight, int32_t *output, int hash_group_num, int bits_per_hash, int feature_num)
-
void hp_lsh_projection_p(const float *hash_seed, const int32_t *feature, const half *weight, int32_t *output, int hash_group_num, int bits_per_hash, int feature_num)
-
void fp_lsh_projection_p(const float *hash_seed, const int32_t *feature, const float *weight, int32_t *output, int hash_group_num, int bits_per_hash, int feature_num)
-
void dp_lsh_projection_p(const float *hash_seed, const int32_t *feature, const double *weight, int32_t *output, int hash_group_num, int bits_per_hash, int feature_num)
C调用示例:
1// MT7004 示例:fp16 (hp) 权重,私有存储单核 2#include <stdio.h> 3 4int main() { 5 float* hash_seed = (float*)0x10000000; 6 int32_t* feature = (int32_t*)0x10001000; 7 half* weight = (half*)0x10002000; 8 int32_t* output = (int32_t*)0x10003000; 9 10 int hash_group_num = 64; 11 int bits_per_hash = 8; 12 int feature_num = 32; 13 14 hp_lsh_projection_p(hash_seed, feature, weight, output, 15 hash_group_num, bits_per_hash, feature_num); 16 return 0; 17}